package com.xuyuan.ai.embedding;

import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author xuyuan
 * @desc Embedding，示例使用的是千帆提供的tao-8k嵌入模型
 * Embedding是文本、图像或视频的数字表示，用于捕捉输入之间的关系。Embedding的工作原理是将文本、图像和视频转换为浮点数数组（称为向量）。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维数。
 * 通过计算两段文本的向量表示之间的数值距离，应用程序可以确定用于生成嵌入向量的对象之间的相似性。
 * @see EmbeddingModel EmbeddingModel旨在直接与人工智能和机器学习中的嵌入模型集成
 */
@RestController
public class EmbeddingController {

    @Autowired
    @Qualifier("qianFanEmbeddingModel")
    private EmbeddingModel embeddingModel;


    /**
     * 直接通过EmbeddingModel提供的核心接口获取向量
     *
     * @desc 获取文本向量
     */
    @GetMapping("/ai/embedding/text")
    public float[] embed1(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        EmbeddingResponse embeddingResponse = embeddingModel.embedForResponse(List.of(message));
        return embeddingResponse.getResult().getOutput();

    }

    /**
     * tao-8k由Huggingface开发者amu研发并开源的长文本向量表示模型，支持8k上下文长度，模型效果在C-MTEB上居前列，是当前最优的中文长文本embeddings模型之一。暂时不支持图像、视频
     */
    @PostMapping("/ai/embedding/image")
    public float[] embed2(@RequestPart("image") MultipartFile image) {
        return new float[0];
    }
}